<?php
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Autenticacao
 *
 * @author assistencia
 */
class Autenticacao {
    private static $idSessao;
    private static $Pessoa_idPessoa;
    private static $ultimoAcesso;
    private static $ip;
    private static $user_agent;
    private static $horaLogin;


    public static function capturarIdUsuarioLogado(){
        global $cnxIntra;
        /*
         * Sele��o do ID do Usu�rio.
         */
        $idSessao = $_SESSION['idSessao'];
        $sql = "SELECT Pessoa_idPessoa from sessao WHERE idSessao = :idSessao";
        $queryIntra = new ConsultaPreparada($cnxIntra, $sql);
        $queryIntra->liga('idSessao', $idSessao);
        //$queryIntra->executa();
        //$linhas = $queryIntra->getResultados();
        //$linha1 = $linhas[0];
        $linha1 = $queryIntra->getLinha();
        $idUsuario = $linha1['Pessoa_idPessoa'];
        return $idUsuario;
    }

    public static function autenticar(){
        global $cnxIntra;
        global $formatoData;
        //Armazena a IdSessao ou Vazio caso a sessao nao tenha iniciado
        if(isset ($_SESSION['idSessao'])){
            $idSessao = $_SESSION['idSessao'];
        } else {
            unset($idSessao);
        }
        // Se a sess�o existir
        if(isset($idSessao)){
            // Valido a Se��o
            if(self::validarSessao($idSessao)){
                self::$ultimoAcesso = date($formatoData);
                $ar = array('ultimoAcesso'=>self::$ultimoAcesso,'idSessao'=>self::$idSessao);
                $sql = "UPDATE sessao SET ultimoAcesso = :ultimoAcesso WHERE idSessao = :idSessao";
                $queryIntra = new ConsultaPreparada($cnxIntra, $sql);
                foreach($ar as $campo => $valor){
                    $queryIntra->liga($campo,$valor);
                }
            } else {
                die ("Possivel tentativa de sequestro da sessao, entre em contato com o administrador<br>
                     <a href='logoff.php'>Fa�a o Login novamente</a>
                        ");

            }
        } // Se n�o existir a sessao
        else{
            //A vari�vel recebe o valor do id do usu�rio logado.
            $idPessoa = self::checaLogin();
            //Verifica-se se o id possui um valor nulo.
            if($idPessoa){
                self::$ip = $_SERVER["REMOTE_ADDR"];
                self::$user_agent = $_SERVER['HTTP_USER_AGENT'];
                self::$Pessoa_idPessoa = $idPessoa;
                self::$ultimoAcesso = date($formatoData);
                self::$horaLogin = date($formatoData);
                $ar = array('Pessoa_idPessoa'=>self::$Pessoa_idPessoa,'ultimoAcesso'=>self::$ultimoAcesso,'user_agent'=>self::$user_agent,'ultimoAcesso'=>self::$ultimoAcesso,'ip'=>self::$ip,'horaLogin'=>self::$horaLogin);
                $sql = "INSERT INTO sessao (Pessoa_idPessoa,ip,user_agent,ultimoAcesso,horaLogin) VALUES (:Pessoa_idPessoa,:ip,:user_agent,:ultimoAcesso,:horaLogin)";
                $queryIntra = new ComandoPreparado($cnxIntra, $sql);
                //var_dump($ar);
                //Gravando a sess�o
                foreach($ar as $campo => $valor){
                    $queryIntra->liga($campo,$valor);
                }
                //print_r("opa ::".$ar);
                $queryIntra->executa();
                $idSessao = $queryIntra->getUltimoId();
                $_SESSION['idSessao'] = $idSessao;
                //captura o �ltimo id da sess�o inserida no banco e o grava em sess�o.
            }
        }

    }

    public static function checaLogin(){
        global $cnxIntra;
        if(isset ($_POST['Login'])){
            $login = $_POST['Login'];
        }
        if(isset ($_POST['Senha'])){
            $senha = $_POST['Senha'];
        }


        //echo "Login passado: $login <br> Senha passada: $senha<br>";
        if(isset($login) AND isset($senha)){
            $usuario = new Usuario($cnxIntra);
            /* Vari�vel que armazena o ID do usu�rio que tentou logar
             * ------------------------------------------------------
             * Se o usu�rio e senha corresponderem a um usu�rio e senha v�lidos no banco de dados,
             * o valor de $check ser� o identificador do usu�rio logado.
             * Caso n�o haja correspond�ncia do login e senha, o valor de $check ser� nulo.
             */
            $check = $usuario->checaLogin($login,$senha);
            if($check){
                return $check;
            }
            else{
                header( 'Location: login.php' );
            }
        }
        //Caso n�o tenham sido enviados os dados de login e senha, o usu�rio � redirecionado para uma
        //p�gina para informar os dados referentes ao login.
        else{
            header( 'Location: login.php' );
        }
    }

    public static function validarSessao($idSessao){
        //Capturando os valores da sess�o atual no banco de dados, a partir do id da sess�o.
        global $cnxIntra;
        $sql = "SELECT * FROM sessao WHERE idSessao = :idSessao";
        $queryIntra = new ConsultaPreparada($cnxIntra, $sql);
        $queryIntra->liga('idSessao', $idSessao);
        // Trago os dados armazenado no banco
        foreach($queryIntra->getResultados()as $linha){
            self::$Pessoa_idPessoa = $linha['Pessoa_idPessoa'];
            self::$user_agent = $linha['user_agent'];
            self::$ip = $linha['ip'];
            self::$idSessao = $linha['idSessao'];
            self::$ultimoAcesso = $linha['ultimoAcesso'];
        }
        
        //In�cio dos testes de valida��o da sess�o
        //Testar se o user_agent � o mesmo.
        //Testar se o ip � o mesmo.
        //Testar se o tempo limite para esta sess�o est� estourado.
        $ipAtual = $_SERVER["REMOTE_ADDR"];
        $user_agentAtual = $_SERVER['HTTP_USER_AGENT'];
        global $FORMATODATA;
        $ultimoAcessoAtual = date($FORMATODATA);
        if(self::$ip != $ipAtual){
            return false;
        }
        if(self::$user_agent != $user_agentAtual){
            return false;
        }
        global $tempoLimite;
        $tempoAtual;
        /*
        if($tempoLimite > $tempoAtual){
            return false;
        }
         * 
         */
        return true;
    }

    public static function checarNivelApp($app,$op){
        global $cnxIntra;
        /*
         * Sele��o do ID do Usu�rio.
         */
        $idSessao = $_SESSION['idSessao'];
        $sql = "SELECT Pessoa_idPessoa from sessao WHERE idSessao = :idSessao";
        $queryIntra = new ConsultaPreparada($cnxIntra, $sql);
        $queryIntra->liga('idSessao', $idSessao);
        //$queryIntra->executa();
        //$linhas = $queryIntra->getResultados();
        //$linha1 = $linhas[0];
        $linha1 = $queryIntra->getLinha();
        $idUsuario = $linha1['Pessoa_idPessoa'];
        //##############################

        
        /*
         * Sele��o do ID da Aplicaca��o.
         */
        $sql = "SELECT idModulo FROM modulo WHERE nome = :app";
        $queryIntra = new ConsultaPreparada($cnxIntra,$sql);
        $queryIntra->liga('app', $app);
        $queryIntra->executa();
        $linhas = $queryIntra->getResultados();
        $linha1 = $linhas[0];
        $idApp = $linha1["idModulo"];
        //##############################
        
        
        /*
         * Sele��o do n�vel do usu�rio para a aplica��o que ele est� tentando acessar.
         */
        //echo "<br>idUsuario: $idUsuario";
        //echo "<br>idAplicacao: $idApp";
        $sql = "SELECT * FROM permissao WHERE Usuario_Pessoa_idPessoa = :idUsuario AND Aplicacao_idAplicacao = :idAplicacao";
        $queryIntra = new ConsultaPreparada($cnxIntra, $sql);
        $queryIntra->liga('idUsuario', $idUsuario);
        $queryIntra->liga('idAplicacao', $idApp);
        $queryIntra->executa();
        $linhas = $queryIntra->getResultados();
        $linha1 = $linhas[0];
        $nivel = $linha1['nivel'];
        //echo "<h1>N�vel do usuario: $nivel</h1><br>";
        //##############################
        
        //Cadastrando as opera��es que o usu�rio pode executar na aplica��o, de acordo com o seu n�vel de acesso.
        switch($nivel){
            case 1:
                $ops = array('novo','listar','del','edit','Salvar','Alterar','Excluir');
                break;
            case 2:
                $ops = array('novo','listar','Salvar');
                break;
            case 3:
                $ops = array('listar');
                break;
            default:
                $ops = 'tudo';
                break;
        }
        if($nivel == null){
            $ops = array('listar');
        }
        //##############################

        //#####################################################
        //Linha tempor�ria para adicionar permiss�es para todos(retir�-la ap�s testes)
        return true;
        //#####################################################
        
        /*
         * Validando se a opera��o que est� tentando ser executada na aplica��o � permitida ou n�o.
         */
        //Se o usu�rio n�o puder executar todas as opera��es do sistema, � feita a verifica��o das opera��es que ele pode executar.
        if($ops != 'tudo'){
            //Valida��o da opera��o com a lista de opera��es poss�veis.
            if(in_array($op, $ops)){
                return true;
            }
            //Caso n�o possa executar determinada fun��o.
            else{
                return false;
            }
        }
        //Caso o usu�rio possa executar todas as fun��es do sistema.
       else{
           return true;
       }
       //##############################
    }
}
?>
